package model

import (
	"fmt"
	"ginblog/utils/errmsg"
	"gorm.io/gorm"
)

type Article struct {
	Category Category `json:"category" gorm:"foreignKey:Cid"`
	gorm.Model
	Title   string `json:"title" gorm:"type:varchar(255);not null"`
	Cid     int    `json:"cid" gorm:"type:int;not null;"`
	Content string `json:"content" gorm:"type:longtext;"`
	Desc    string `json:"desc" gorm:"type:varchar(255);"`
	Img     string `json:"img" gorm:"type:varchar(255);"`
}

// 添加文章
func CreateArticle(data *Article) int {
	// data.Password = ScryptPw(data.Password)
	// data.BeforeSave() //钩子函数调用，名字不一样需要调用
	err := db.Debug().Create(&data).Error
	if err != nil {
		fmt.Println(err)
		return errmsg.ERROR // 500的错误状态码
	}

	return errmsg.SUCCESS
}

// 查询文章列表
func GetArticleList(pageSize int, pageNum int) ([]Article, int64) {
	var articleList []Article
	var total int64
	//  分页  一页多少条数据，  偏移量
	// 存放在切片中
	err := db.Debug().Preload("Category").Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&articleList)

	//err := db.Debug().Select("*").Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&userList) // err := db.Select("id,username,role,created_at").Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&users)
	err = db.Debug().Model(&articleList).Count(&total)
	if err.Error != nil {
		fmt.Println("查询异常了！！")
		fmt.Println(err.Error)
		return nil, 0
	}
	return articleList, total

}

// 编辑文章
func EditArticle(id int, data *Article) (*Article, int) {
	var article Article
	var maps = make(map[string]interface{})
	maps["title"] = data.Title
	maps["cid"] = data.Cid
	maps["content"] = data.Content
	maps["desc"] = data.Desc
	maps["img"] = data.Img

	err := db.Debug().Model(&article).Where("id = ? ", id).Updates(maps).Error
	if err != nil {
		return nil, errmsg.ERROR
	}
	return &article, errmsg.SUCCESS
}

// 查询分类下的所有文章
func GetCateArticle(id int, pageSize int, pageNum int) ([]Article, int64) {
	var cateArticleList []Article
	var total int64
	err := db.Debug().Preload("Category").Limit(pageSize).Offset((pageNum-1)*pageSize).Where("cid = ?", id).Find(&cateArticleList)
	if err.Error != nil {
		return nil, total
	}
	err = db.Model(&cateArticleList).Count(&total)
	if err.Error != nil {
		return nil, total
	}
	return cateArticleList, total
}

// 钩子函数密码加密
func (c *Article) BeforeSave() {

}

func GetArticleInfo(id int) (*Article, int) {
	var article Article
	err := db.Debug().Preload("Category").Where("id = ? ", id).First(&article)
	if err.Error != nil {
		return nil, errmsg.ERROR_ART_NOT_EXIST
	}
	return &article, errmsg.SUCCESS
}

// 删除分类
func DeleteArticle(id int) int {
	var article Article
	//err := db.Debug().Model(&cate).Where("id = ? ", id).First(&cate)
	//if err != nil {
	//	return errmsg.ERROR
	//}
	// 有bug 应该先确认数据库中有误这个id的数据，如果没有删毛线
	err := db.Debug().Where("id = ? ", id).Delete(&article).Error
	if err != nil {
		return errmsg.ERROR
	}
	return errmsg.SUCCESS
}
